package cn.dgut.jy.soro.service.impl;

import cn.dgut.jy.soro.entity.Cart;
import cn.dgut.jy.soro.entity.CartItem;
import cn.dgut.jy.soro.entity.Product;
import cn.dgut.jy.soro.repository.CartItemRepository;
import cn.dgut.jy.soro.repository.CartRepository;
import cn.dgut.jy.soro.repository.UserRepository;
import cn.dgut.jy.soro.repository.ProductRepository;
import cn.dgut.jy.soro.service.CartItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.LinkedList;
import java.util.List;

@Service
public class CartItemServiceImpl implements CartItemService {
    private CartRepository cartRepository;
    private UserRepository userRepository;
    private CartItemRepository cartItemRepository;
    private ProductRepository productRepository;

    @Autowired
    public CartItemServiceImpl(CartRepository cartRepository, UserRepository userRepository, CartItemRepository cartItemRepository, ProductRepository productRepository) {
        this.cartRepository = cartRepository;
        this.userRepository = userRepository;
        this.cartItemRepository = cartItemRepository;
        this.productRepository = productRepository;
    }


    @Override
    public Boolean addItem(Integer userId, Integer productId, Integer amount) {
        Integer cartId = userRepository.findById(userId).get().getCart_id();

        CartItem cartItem = cartItemRepository.findByCartIdAndProductId(cartId, productId);

        Float addPrice = productRepository.findById(productId).get().getPrice() * amount;

        if (cartItem == null) {
            cartItem = new CartItem();
        }

        cartItem.setCartId(cartId);
        cartItem.setProductId(productId);
        cartItem.setAmount(cartItem.getAmount() + amount);
        cartItem.setTotalPrice(cartItem.getTotalPrice() + addPrice);
        cartItemRepository.save(cartItem);

        if (cartRepository.findById(productId).isPresent()) {
            Cart cart = cartRepository.findById(productId).get();
            cart.setTotalPrice(cart.getTotalPrice() + addPrice);
            cartRepository.save(cart);
            return true;
        }

        return false;
    }

    @Override
    public Boolean removeItem(Integer userId, Integer productId) {
        if (userRepository.findById(userId).isPresent()) {
            cartItemRepository.deleteByCartIdAndProductId(
                    userRepository.findById(userId).get().getCart_id(), productId);
            return true;
        }
        return false;
    }

    @Override
    public List<Product> getProductsByCartItems(List<CartItem> cartItems) {
        List<Product> products = new LinkedList<>();
        for (CartItem cartItem : cartItems
        ) {
            if (productRepository.findById(cartItem.getProductId()).isPresent()) {
                products.add(productRepository.findById(cartItem.getProductId()).get());
            }
        }
        return products;
    }
}
